/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = sybase_core.h                                                 */
/*  NOTE      =                                                               */
/*  DATE      = 2015/05/27 by zhengxd                                         */
/******************************************************************************/
#ifndef _SYBASE_CORE_H_
#define _SYBASE_CORE_H_

#include "sybase_base_type.h"

/*
 *  分片包数据
*/
typedef struct __st_L7_fragment_sybase {
    int i_end_packet_flg;                  /* packet结束flag */
    int i_residual_packet_head_len;        /* 残留packet的头数据长度 */
    char arr_residual_packet_head[8];      /* 残留packet的头数据 */
    unsigned ui_total_len;                /* 实际数据总长度 */
    unsigned ui_remain_len;               /* 还需要接受的数据长度 */
    unsigned ui_parsed_index;             /* 解析到的位置 */
    Frbyte_Packet *p_st_data;              /* packet数据 */
    struct timeval st_first_timestamp;    /* 第一个分片包的时间 */
    struct timeval st_end_timestamp;      /* 最后一个分片包的时间 */
} L7_fragment_sybase;

/*
 *   L7session_sybase 用于存放sybase私有的session数据,
 *   对应L7_session的p_session_private变量
 *   通用的username、dbname、hostname、programname
*/
typedef struct __st_L7session_sybase {
    char *p_cli_host_user;                /* 客户端的主机名 */
    char *p_program;                      /* 客户端的程序名 */
    char *p_db_name;                      /* 数据库名 */
    char *p_db_user;                      /* 登陆用户名 */
    char *p_tds_charset;                  /* TDS charset */
    int i_confirmed_endian;               /* 字节序是否确定 */
    LITTLE_BIG_ENDIAN i_lint2_endian;      /* 2byte int字节序 */
    LITTLE_BIG_ENDIAN i_lint4_endian;      /* 4byte int字节序 */
    Frtds_type_float i_lflt_type;          /* 浮点型字节格式 */
    LITTLE_BIG_ENDIAN i_ldate_endian;      /* date字节序 */
    int i_lnoshort_type;                  /* 4byte datetime,money,floating数据是否需要自动转换成8byte的 */
    Frtds_type_float i_lflt4_type;         /* 4byte 浮点型字节格式 */
    LITTLE_BIG_ENDIAN i_ldate4_endian;     /* 4byte date字节序 */
    int i_columnstatus;
    int i_nocolumnstatus;
    struct timeval st_login;

} L7session_sybase;

/*
 *  Sybase请求
 *  对应L7_requestdata中的p_request_private数据
*/
typedef struct __st_L7_req_sybase {

    uint8_t u8_packet_type;                /* 当前packet类型 */
    int i_req_type;                        /* request类型 */
    int i_login_status;                    /* login状态 */
    int i_need_req_resp;                   /* 下一个所需数据类型 */
    int i_cancel_flg;                      /* NORMAL(0)/IGNORE(1)/ATTENTION(2) */
    int i_report_flg;
    int i_need_params;                     /* 是否需要参数 */
    int i_dynamic_type;                    /* dynamic token type */
    int i_new_statement;                   /* statement是否是新创建的 */
    int i_send_metadata;                   /* bind参数altmetadata信息需要保存 */
    int i_get_metadata;                    /* bind参数altmetadata信息从hash中取 */
    int i_declare_flg;                     /* close删除标识 */
    long l_cursor_id;                      /* cursor ID */
    char arr_id[FRTDS_MAX_NAME + 1];         /* prepare ID */
    char arr_cursor_name[FRTDS_MAX_NAME + 1];/* cursor ID */
    char *p_sql;                           /* sql */
    Frlist_header st_metadata_tmp;         /* bind参数altmetadata信息 */
    Frlist_header st_metadata_bind;        /* bind参数altmetadata信息 */
    Sql_statement *p_st_statement;         /* 对应游标数据 */
    Sql_resultset *p_st_resultset;         /* 对应结果集索引 */
} L7_req_sybase;

/*
 *  Sybase响应
 *  解析response过程中的数据
*/
typedef struct __st_L7_resp_sybase {

    int i_err_flg;
    int i_error_num;                       /* 错误号 */
    char *p_error_msg;                     /* 错误信息 */
    unsigned long ui_effect_rows;         /* 影响行数 */
    unsigned long ui_fetch_rows;          /* fetch行数 */
    long l_cursor_id;                      /* cursor ID */
    char arr_id[FRTDS_MAX_NAME + 1];         /* prepare ID */
    char arr_cursor_name[FRTDS_MAX_NAME + 1];/* cursor ID */
    Frlist_header st_metadata_param;       /* param的metadata信息 */
    Frlist_header st_metadata_column;      /* cloum的metadata信息 */
    Frlist_header st_altfmt;               /* altfmt信息 */
}L7_resp_sybase;

/*
 *  Sybase私有数据
*/
typedef struct __st_L7session_sybase_private {

    int i_in_session;                      /* session flag */
    L7_fragment_sybase *p_st_fragment;     /* 分片包数据 */
    L7session_sybase *p_st_sess;           /* session数据 */
    L7_req_sybase *p_st_req;               /* request数据 */
    L7_resp_sybase *p_st_resp;             /* response信息 */
    Frhash_header *p_hash_prepare;         /* prepare数据(Sql_statement *) */
} L7session_sybase_private;

int sybase_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);

int sybase_analysis(Conntrack *p_st_conn
                  , Apm_packet *p_st_packet
                  , Frhash_header *p_st_hash_report);

int sybase_session_destroy(void *p_private_session);

#endif
